iT邦幫忙

2023 iThome 鐵人賽

DAY 20
1
Security

Windows Security 101系列 第 20

[Day20] .NET - Common Intermediate Lanaguage (CIL Code)

  • 分享至 

  • xImage
  •  

今天的內容是 CIL Code,也就是 .NET PE File 的程式碼在檔案中儲存的形式。

Disassembly

根據上一篇的實驗,將 C# 程式碼以 CIL Code 來檢視的話會呈現下圖:

https://ithelp.ithome.com.tw/upload/images/20231004/20120098gbMTzmu2yC.png

從 dnspy 反組譯的結果可以看到 CIL Code 其實和組合語言差不多。

Visual Studio 內建的 ILDASM.exe 也可以用來解析 CIL Code。

https://ithelp.ithome.com.tw/upload/images/20231004/20120098Fo6klaHtaY.png

我個人覺得這款蠻好用的

https://ithelp.ithome.com.tw/upload/images/20231004/20120098RPdsSO7bHd.png

也可以得到和 dnspy 一樣的結果。

Understanding Common Intermediate Language (CIL)

接下來要介紹一些在反組譯的 CIL Code 裡面會看到的 keywords,主要是根據這篇文章作的筆記:

CIL Directives

  • token 的開頭是 .
  • e.g.,  .assembly , .namespace , .class , .method , .ctor , .override

CIL Attributes

  • 這種 token 通常會和 CIL Directive 一起使用,用來描述 CIL Directive 該如何被處理
  • e.g., public , extends , implements , hidebysig

Stack Machine

.NET Runtime 是和 JVM 一樣,都是採用 Stack Machine 的設計,也就是不像 x86 或 ARM 有 registers 可以存放計算過程中的資料。Stack Machine 會將中間產物或函數的參數放在 stack 上,透過 pop 或 push 等價的指令或是以計算位置的方式存取 stack。

  • .maxstack 表示 stack 的大小。如果沒有特別標示的話,預設值是 8。
  • ld 開頭的就是 push
  • st 開頭的就是 pop

Common Instructions

在 CIL Code 中,opcode 的大小都是一個 bytes。
下面是一些常見的指令:

  • ldc.i4.m1
    • Push 4-bytes 的 -1
  • ldc.i4.s *num*
    • Push 4-bytes 的 num
  • ldstr
    • Push String
  • ldfld
    • Push Field of an object
  • ldarg
    • Push by-value 的參數
  • ldarga
    • Push by-reference 的參數
  • stloc.n
    • Pop 一個值並存到 local variable 的 index n
  • starg.n
    • Pop 一個值並存到 method argument 的 index n.
  • pop
  • ret
  • ldloc.x
    • Push local variable x
  • ldloca
    • Push memory address of local variable.
  • ldc.*
    • Push 常數 (int32,int62,float32,float64)
  • br target
    • 跳到相對位置
    • target 是 4-bytes 有號整數
  • br.s target
    • 跳到相對位置
    • target 是 1-bytes 有號整數
  • clt
    • stack 上的兩個數由深至淺是 v1 和 v2
    • v1 < v2 的話,Push 1; 否則 Push 0
  • blt target
    • v1 < v2 的話才需要跳至 target
  • bgt target
    • v1 > v2 的話才需要跳至 target

下一篇要介紹的是 FlareOn 在去年的題目 backdoor!

References


上一篇
[Day19] .NET - PE Format
下一篇
[Day21] .NET - Dynamic Method (FlareOn9 - 08 Backdoor)
系列文
Windows Security 10130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言